### `FX_CodePage` 和 `FX_Charset` 枚举及辅助函数总结

`FX_CodePage` 和 `FX_Charset` 是 PDFium 库中用于定义字符编码和字符集的枚举类型，主要用于处理不同字符编码之间的转换。以下是这些枚举类型及其相关辅助函数的功能概述：

#### 枚举类型(Enum Types)

1. * *`enum class FX_CodePage : uint16_t`* * :
-定义了多种常见的字符编码方式，涵盖了从 ANSI、DOS 到 Unicode 的各种编码。
- **常用编码 * *：
- **`kDefANSI = 0`* * : 默认 ANSI 编码。
- **`kUTF8 = 65001`* * : UTF - 8 编码。
- **`kUTF16LE = 1200`* * : UTF - 16 小端编码。
- **`kUTF16BE = 1201`* * : UTF - 16 大端编码。
- **`kShiftJIS = 932`* * : Shift - JIS 编码（日文）。
- **`kChineseSimplified = 936`* * : GBK 编码（简体中文）。
- **`kHangul = 949`* * : EUC - KR 编码（韩文）。
- **`kChineseTraditional = 950`* * : Big5 编码（繁体中文）。
- **`kMSWin_WesternEuropean = 1252`* * : Windows 西欧语言编码。
- **`kMAC_Roman = 10000`* * : Mac 罗马编码。
- **特殊值 * *：
- **`kFailure = 65535`* * : 表示编码转换失败。

2. * *`enum class FX_Charset : uint8_t`* * :
-定义了多种常见的字符集，主要用于 Windows 和 Mac 平台上的字符集标识。
- **常用字符集 * *：
- **`kANSI = 0`* * : ANSI 字符集。
- **`kDefault = 1`* * : 默认字符集。
- **`kSymbol = 2`* * : 符号字符集。
- **`kShiftJIS = 128`* * : Shift - JIS 字符集（日文）。
- **`kHangul = 129`* * : Hangul 字符集（韩文）。
- **`kJohab = 130`* * : Johab 字符集（韩文扩展）。
- **`kChineseSimplified = 134`* * : GBK 字符集（简体中文）。
- **`kChineseTraditional = 136`* * : Big5 字符集（繁体中文）。
- **`kMSWin_Greek = 161`* * : Windows 希腊语字符集。
- **`kMSWin_Turkish = 162`* * : Windows 土耳其语字符集。
- **`kMSWin_Vietnamese = 163`* * : Windows 越南语字符集。
- **`kUS = 254`* * : 美国字符集。
- **`kOEM = 255`* * : OEM 字符集。

#### 结构体(Struct)

1. * *`struct FX_CharsetUnicodes`* * :
-用于存储字符集到 Unicode 码点的映射关系。
- **成员变量 * *：
- **`FX_Charset m_Charset;`** : 字符集标识。
- **`pdfium: : span<const uint16_t> m_pUnicodes;`** : Unicode 码点的只读视图。

2. * *`extern const std::array<FX_CharsetUnicodes, 8> kFX_CharsetUnicodes;`** :
-定义了一个常量数组，包含 8 种常见字符集到 Unicode 码点的映射表。

#### 辅助函数(Helper Functions)

1. * *`FX_CodePage FX_GetACP();`** :
-获取当前系统的默认 ANSI 代码页。返回一个 `FX_CodePage` 类型的值，表示当前系统的默认编码。

2. * *`FX_CodePage FX_GetCodePageFromCharset(FX_Charset charset);`** :
-根据给定的字符集（`charset`）获取对应的代码页。返回一个 `FX_CodePage` 类型的值，表示对应的编码。

3. * *`FX_Charset FX_GetCharsetFromCodePage(FX_CodePage codepage);`** :
-根据给定的代码页（`codepage`）获取对应的字符集。返回一个 `FX_Charset` 类型的值，表示对应的字符集。

4. * *`FX_Charset FX_GetCharsetFromInt(int value);`** :
-根据给定的整数值（`value`）获取对应的字符集。返回一个 `FX_Charset` 类型的值，表示对应的字符集。

5. * *`bool FX_CharSetIsCJK(FX_Charset uCharset);`** :
-检查给定的字符集（`uCharset`）是否属于 CJK（中日韩）字符集。返回布尔值，`true` 表示是 CJK 字符集，`false` 表示不是。

6. * *`size_t FX_WideCharToMultiByte(FX_CodePage codepage, WideStringView wstr, pdfium::span<char> buf);`** :
-将宽字符字符串（`wstr`）转换为多字节字符串，并将结果存储在指定的缓冲区（`buf`）中。返回转换后的字节数。`codepage` 指定目标编码。

7. * *`size_t FX_MultiByteToWideChar(FX_CodePage codepage, ByteStringView bstr, pdfium::span<wchar_t> buf);`** :
-将多字节字符串（`bstr`）转换为宽字符字符串，并将结果存储在指定的缓冲区（`buf`）中。返回转换后的字符数。`codepage` 指定源编码。

### 功能概述

`FX_CodePage` 和 `FX_Charset` 枚举及其相关辅助函数共同作用，提供了以下主要功能：

1. * *字符编码和字符集的定义 * *：通过 `FX_CodePage` 和 `FX_Charset` 枚举，定义了多种常见的字符编码和字符集，涵盖了全球范围内的多种语言和区域设置。
2. * *编码和字符集的相互转换 * *：提供了多个辅助函数，用于在字符编码和字符集之间进行相互转换，确保不同编码系统之间的兼容性和互操作性。
3. * *多字节和宽字符的转换 * *：通过 `FX_WideCharToMultiByte` 和 `FX_MultiByteToWideChar` 函数，支持宽字符和多字节字符之间的高效转换，确保文本数据在不同编码环境下的正确处理。
4. * *CJK 字符集的识别 * *：通过 `FX_CharSetIsCJK` 函数，能够识别是否为 CJK（中日韩）字符集，特别适用于处理东亚语言的文本。
5. * *系统默认编码的获取 * *：通过 `FX_GetACP` 函数，能够获取当前系统的默认 ANSI 代码页，方便在不同操作系统环境下进行编码转换。

这些功能共同作用，使得 `FX_CodePage` 和 `FX_Charset` 在 PDF 文档处理过程中能够高效地管理和使用字符编码，确保文本的正确显示和渲染。特别是对于包含多语言文本或复杂字符集的 PDF 文档，这些功能的作用尤为关键。
// Copyright 2014 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FXCRT_FX_CODEPAGE_H_
#define CORE_FXCRT_FX_CODEPAGE_H_

#include <stdint.h>

#include <array>

// Prove consistency with incomplete forward definitions.
#include "core/fxcrt/fx_codepage_forward.h"
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/span.h"

enum class FX_CodePage : uint16_t {
  kDefANSI = 0,
  kSymbol = 42,
  kMSDOS_US = 437,
  kArabic_ASMO708 = 708,
  kMSDOS_Greek1 = 737,
  kMSDOS_Baltic = 775,
  kMSDOS_WesternEuropean = 850,
  kMSDOS_EasternEuropean = 852,
  kMSDOS_Cyrillic = 855,
  kMSDOS_Turkish = 857,
  kMSDOS_Portuguese = 860,
  kMSDOS_Icelandic = 861,
  kMSDOS_Hebrew = 862,
  kMSDOS_FrenchCanadian = 863,
  kMSDOS_Arabic = 864,
  kMSDOS_Norwegian = 865,
  kMSDOS_Russian = 866,
  kMSDOS_Greek2 = 869,
  kMSDOS_Thai = 874,
  kShiftJIS = 932,
  kChineseSimplified = 936,
  kHangul = 949,
  kChineseTraditional = 950,
  kUTF16LE = 1200,
  kUTF16BE = 1201,
  kMSWin_EasternEuropean = 1250,
  kMSWin_Cyrillic = 1251,
  kMSWin_WesternEuropean = 1252,
  kMSWin_Greek = 1253,
  kMSWin_Turkish = 1254,
  kMSWin_Hebrew = 1255,
  kMSWin_Arabic = 1256,
  kMSWin_Baltic = 1257,
  kMSWin_Vietnamese = 1258,
  kJohab = 1361,
  kMAC_Roman = 10000,
  kMAC_ShiftJIS = 10001,
  kMAC_ChineseTraditional = 10002,
  kMAC_Korean = 10003,
  kMAC_Arabic = 10004,
  kMAC_Hebrew = 10005,
  kMAC_Greek = 10006,
  kMAC_Cyrillic = 10007,
  kMAC_ChineseSimplified = 10008,
  kMAC_Thai = 10021,
  kMAC_EasternEuropean = 10029,
  kMAC_Turkish = 10081,
  kUTF8 = 65001,
  kFailure = 65535,
};

enum class FX_Charset : uint8_t {
  kANSI = 0,
  kDefault = 1,
  kSymbol = 2,
  kMAC_Roman = 77,
  kMAC_ShiftJIS = 78,
  kMAC_Korean = 79,
  kMAC_ChineseSimplified = 80,
  kMAC_ChineseTraditional = 81,
  kMAC_Hebrew = 83,
  kMAC_Arabic = 84,
  kMAC_Greek = 85,
  kMAC_Turkish = 86,
  kMAC_Thai = 87,
  kMAC_EasternEuropean = 88,
  kMAC_Cyrillic = 89,
  kShiftJIS = 128,
  kHangul = 129,
  kJohab = 130,
  kChineseSimplified = 134,
  kChineseTraditional = 136,
  kMSWin_Greek = 161,
  kMSWin_Turkish = 162,
  kMSWin_Vietnamese = 163,
  kMSWin_Hebrew = 177,
  kMSWin_Arabic = 178,
  kMSWin_Baltic = 186,
  kMSWin_Cyrillic = 204,
  kThai = 222,
  kMSWin_EasternEuropean = 238,
  kUS = 254,
  kOEM = 255,
};

// Hi-bytes to unicode codepoint mapping for various code pages.
struct FX_CharsetUnicodes {
  FX_Charset m_Charset;
  pdfium::span<const uint16_t> m_pUnicodes;
};

extern const std::array<FX_CharsetUnicodes, 8> kFX_CharsetUnicodes;

FX_CodePage FX_GetACP();
FX_CodePage FX_GetCodePageFromCharset(FX_Charset charset);
FX_Charset FX_GetCharsetFromCodePage(FX_CodePage codepage);
FX_Charset FX_GetCharsetFromInt(int value);
bool FX_CharSetIsCJK(FX_Charset uCharset);
size_t FX_WideCharToMultiByte(FX_CodePage codepage,
                              WideStringView wstr,
                              pdfium::span<char> buf);
size_t FX_MultiByteToWideChar(FX_CodePage codepage,
                              ByteStringView bstr,
                              pdfium::span<wchar_t> buf);

#endif  // CORE_FXCRT_FX_CODEPAGE_H_
